/////precompiled////////
#include "precompiled.h"
////////////////////////


#include "svl_TValue.h"
using namespace svl;
                      
// TValueInteger //////////////////////////////////////////////////////////////

//
TString TValueInteger::GetInfo() 
{ 
  TString S; if (isNull) {
    S = "NULL";
  }
  else { 
    S = value;
  }
  return S << " [" << svl_ClassName(*this) << "]";
}

//
TInfoParam TValueInteger::AddInfoTo(TInfoParam Info)
{ 
  if (isNull) {
    return TValue::AddInfoTo(Info)
     .Add("value","NULL");
  }
  return TValue::AddInfoTo(Info)
   .Add("value",value);
}

// TValueDouble ///////////////////////////////////////////////////////////////

//
TString TValueDouble::GetInfo() 
{ 
  TString S; if (isNull) {
    S = "NULL";
  }
  else { 
    S = value;
  }
  return S << " [" << svl_ClassName(*this) << "]";
}

//
TInfoParam TValueDouble::AddInfoTo(TInfoParam Info)
{ 
  if (isNull) {
    return TValue::AddInfoTo(Info)
     .Add("value","NULL");
  }
  return TValue::AddInfoTo(Info)
   .Add("value",value);
}

// TValueString ///////////////////////////////////////////////////////////////

//
TString TValueString::GetInfo() 
{ 
  TString S; if (isNull) {
    S = "NULL";
  }
  else { 
    S << "\"" << value << "\"";
  }
  return S << " [" << svl_ClassName(*this) << "]";
}

//
TInfoParam TValueString::AddInfoTo(TInfoParam Info)
{ 
  if (isNull) {
    return TValue::AddInfoTo(Info)
     .Add("value","NULL");
  }
  return TValue::AddInfoTo(Info)
   .AddString("value",value);
}

// TValueVariant //////////////////////////////////////////////////////////////

//
void TValueVariant::CopyFrom(TValueVariant &V)
{
  if (V.value) {
    if (!value) {
      value = V.value->New();
    }
    else if (value->GetType() != V.value->GetType()) {
      delete value;
      value = V.value->New();
    }
    
    value->CopyFrom(V.value);
  }
  else {
    delete value; value = NULL;
  }
}

//
void TValueVariant::SetValueInteger(int V) 
{ 
  if (!value || value->GetType() != TValue::EType_Integer) {
    delete value; value = new TValueInteger;
  }
  static_cast<TValueInteger*>(value)->SetValue(V);
}

//
void TValueVariant::SetValueDouble(double V) 
{ 
  if (!value || value->GetType() != TValue::EType_Double) {
    delete value; value = new TValueDouble;
  }
  static_cast<TValueDouble*>(value)->SetValue(V);
}

//
void TValueVariant::SetValueString(TString V) 
{ 
  if (!value || value->GetType() != TValue::EType_String) {
    delete value; value = new TValueString;
  }
  static_cast<TValueString*>(value)->SetValue(V);
}

//
int TValueVariant::GetValueInteger()
{
  if (value && value->GetType() == TValue::EType_Integer) {
    return static_cast<TValueInteger*>(value)->GetValue();
  }
  Except("GetValueInteger");
  return 0;
}

//
double TValueVariant::GetValueDouble()
{
  if (value && value->GetType() == TValue::EType_Double) {
    return static_cast<TValueDouble*>(value)->GetValue();
  }
  Except("GetValueDouble");
  return 0;
}

//
TString TValueVariant::GetValueString()
{
  if (value && value->GetType() == TValue::EType_String) {
    return static_cast<TValueString*>(value)->GetValue();
  }
  Except("GetValueString");
  return TString();
}

//
TInfoParam TValueVariant::AddInfoTo(TInfoParam Info)
{
  if (value) {
    return TPointer::AddInfoTo(Info)
      .Add("value",*value);
  }
  return TPointer::AddInfoTo(Info)
    .Add("value",value);


/*************
  TString S; if (value) {
    S = value->GetInfo();
  }
  else {
    S = "NULL";
  }
  S << " [" << svl_ClassName(*this) << "]";

  Info.Add(AttrName,S);

  if (value) { 
    //value->AddInfoTo(Info);
    Info.Add("value",*value);
  }
*************/  
}
